﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    public partial class formularioUnidades : UserControl
    {
        private static readonly formularioUnidades instancia = new formularioUnidades();
        public static formularioUnidades Instancia
        {
            get { return instancia; }
        }

        private ArrayList lista;

        /// <summary>
        /// Estado del formulario, para averigüar si podemos perder datos durante la edición.
        /// </summary>
        private string estado = "editar";
        public string Estado
        {
            get { return estado; }
            set { estado = value; }
        }
        private bool cambio;

        private int rowsPaginas;
        public int RowsPaginas
        {
            get { return rowsPaginas; }
            set { rowsPaginas = value; }
        }

        private int pagina;
        public int Pagina
        {
            get { return pagina; }
            set { pagina = value; }
        }

        public formularioUnidades()
        {
            InitializeComponent();

            cambio = true;
            estado = "editar";
            pagina = 1;
            rowsPaginas = 5;

            MuestraForm(formularioUnidadEditar.Instancia);  
        }

        private void formularioUnidades_Load(object sender, EventArgs e)
        {
            // Cogemos la información de la base de datos y la metemos en el dgv
            // Para ello usaremos una función auxiliar que nos será útil para llamarla desde otros lugares.
            if (cambio)
            {
                RellenaDGV(false, pagina, rowsPaginas);
                cambio = false;
            }
        }

        /// <summary>
        /// Rellena el dataGrid con la información de la búsqueda.
        /// </summary>
        /// <param name="lista"></param>
        public void RellenaDgvBuscar(ArrayList lista)
        {
            int numFilas = 0;
            //lista = CADUnidad.Instancia.getUnidades();
            dgvUnidades.Rows.Clear();
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\unidades\";
            bool primero = true;
            foreach (ENUnidad un in lista)
            {
                if (primero == true)
                {
                    if (un != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioUnidadEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioUnidadEditar.Instancia.cargarDatos(un.Nombre.ToString(), un.Defensa.ToString(), un.Ataque.ToString(), un.Velocidad.ToString(), un.Vida.ToString(), un.Tiempo.ToString(), un.Descripcion);
                        
                        // Ya hemos seleccionado el primero.
                        primero = false;
                    }
                }
                
                dgvUnidades.Rows.Add(1);
                try
                {
                    dgvUnidades.Rows[numFilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + un.Nombre + ".png");
                }
                catch (Exception)
                {
                    dgvUnidades.Rows[numFilas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;
                }
                dgvUnidades.Rows[numFilas].Cells[1].Value = un.Nombre.ToString();
                numFilas++;
            }

            // No se ha cargado ninguna unidad en el dgv.
            if (primero == true)
            {
                // Limpiamos los posibles datos residuales.
                formularioUnidadEditar.Instancia.BorraForm();
            }
        }

        /// <summary>
        ///  Rellena el dataGrid con toda la información de las unidades.
        /// </summary>
        /// <param name="nuevo"></param>
        /// <param name="pagina"></param>
        /// <param name="tamano"></param>
        public void RellenaDGV(bool nuevo, int pagina, int tamano)
        {

            try
            {
                int numFilas = 0;
                lista = CADUnidad.Instancia.getUnidades();
                dgvUnidades.Rows.Clear();
                string mdf = Application.ExecutablePath;
                mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

                formularioUnidadEditar.Instancia.Un = new ENUnidad();

                string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
                mdf2 += @"\clonegame\imagenes\unidades\";
                int i = 0;
                foreach (ENUnidad un in lista)
                {
                    if (i == 0 && nuevo == false)
                    {
                        if (un != null)
                        {
                            // Pasamos al estado de edición.
                            estado = "editar";

                            // Cargamos el formulario de edición.
                            MuestraForm(formularioUnidadEditar.Instancia);

                            // Completamos la información del formulario.
                            formularioUnidadEditar.Instancia.cargarDatos(un.Nombre.ToString(), un.Defensa.ToString(), un.Ataque.ToString(), un.Velocidad.ToString(), un.Vida.ToString(), un.Tiempo.ToString(), un.Descripcion);
                        }
                    }
                    i++;
                    dgvUnidades.Rows.Add(1);
                    try
                    {
                        dgvUnidades.Rows[numFilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + un.Nombre + ".png");
                    }
                    catch (Exception)
                    {
                        dgvUnidades.Rows[numFilas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;
                    }

                    

                    dgvUnidades.Rows[numFilas].Cells[1].Value = un.Nombre.ToString();
                    numFilas++;
                }

                if (lista.Count == 0)
                {
                    formularioUnidadEditar.Instancia.BorraForm();
                }

                if (formularioUnidadEditar.Instancia.Un == null)
                {
                    formularioUnidadEditar.Instancia.Un = new ENUnidad();
                    formularioUnidadEditar.Instancia.BorraForm();
                }

                estado = "editar";

                if (nuevo == true)
                {
                    dgvUnidades.SelectedRows[0].Selected = false;
                    dgvUnidades.Rows[dgvUnidades.Rows.Count - 1].Selected = true;
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            
        }

        public void MuestraForm(UserControl u)
        {
            pUnidades.Controls.Clear();
            pUnidades.Controls.Add(u);
            u.Dock = DockStyle.Fill;
        }


        private void btAnadir_Click(object sender, EventArgs e)
        {
            formularioUnidadEditar.Instancia.BorraForm();

            if (estado != "editar")
            {
                MuestraForm(formularioUnidadEditar.Instancia);
            }
        }

        /// <summary>
        /// Elimina las unidads seleccionadas
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btEliminar_Click(object sender, EventArgs e)
        {
            ArrayList seleccionados = new ArrayList();
            int seleccionadas = dgvUnidades.SelectedRows.Count;
            try
            {
                if (seleccionadas < 1)
                {
                    MessageBox.Show("Debe seleccionar alguna unidad primero.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
                }
                else if (seleccionadas == 1)
                {
                    string nombreUnidad = dgvUnidades.SelectedRows[0].Cells[1].Value.ToString();
                    if (MessageBox.Show("¿Desea eliminar la unidad " + nombreUnidad + "?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        string destino = Application.ExecutablePath;
                        destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                        destino += @"\imagenes\unidades";
                        destino += @"\" + dgvUnidades.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                        // Código para trasladar la imágen también a la web.
                        string destinoWeb = Application.ExecutablePath;
                        destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                        destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\unidades";
                        destinoWeb += @"\" + dgvUnidades.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                        formularioUnidadEditar.Instancia.pbImagen.Image.Dispose();
                        //formularioEdificioEditar.Instancia.pbImagenEd.Image = null;

                        ((Image)dgvUnidades.SelectedRows[0].Cells[0].Value).Dispose();

                        System.GC.Collect();
                        System.GC.WaitForPendingFinalizers();

                        CADUnidad.Instancia.EliminaUnidad(dgvUnidades.SelectedRows[0].Cells[1].Value.ToString());
                        RellenaDGV(false, pagina, rowsPaginas);

                        ENActividad act = new ENActividad();
                        act.Accion = "Baja";
                        act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                        act.Descripcion = "Ha dado de baja la unidad " + nombreUnidad + ".";
                        act.Fecha = DateTime.Now.ToString();
                        CADActividad.Instancia.InsertarActividad(act);

                        File.Delete(destino);
                        File.Delete(destinoWeb);
                    }
                }
                else
                {
                    if (MessageBox.Show("¿Desea eliminar " + seleccionadas + " unidades?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        foreach (DataGridViewRow r in dgvUnidades.SelectedRows)
                        {
                            string destino = Application.ExecutablePath;
                            destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                            destino += @"\imagenes\unidades";
                            destino += @"\" + dgvUnidades.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                            // Código para trasladar la imágen también a la web.
                            string destinoWeb = Application.ExecutablePath;
                            destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                            destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\unidades";
                            destinoWeb += @"\" + dgvUnidades.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                            CADUnidad.Instancia.EliminaUnidad(r.Cells[1].Value.ToString());

                            formularioUnidadEditar.Instancia.pbImagen.Image.Dispose();

                            ((Image)r.Cells[0].Value).Dispose();

                            System.GC.Collect();
                            System.GC.WaitForPendingFinalizers();

                            File.Delete(destino);
                            File.Delete(destinoWeb);
                        }

                        RellenaDGV(false, pagina, rowsPaginas);

                        ENActividad act = new ENActividad();
                        act.Accion = "Baja";
                        act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                        act.Descripcion = "Ha dado de baja " + seleccionadas + " unidades.";
                        act.Fecha = DateTime.Now.ToString();
                        CADActividad.Instancia.InsertarActividad(act);
                    }
                }
                // Actualizamos el DGV de bienvenida.
                formularioBienvenida.Instancia.actualizaResumen();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (pagina > 1)
            {
                pagina--;
                RellenaDGV(false, pagina, rowsPaginas);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (dgvUnidades.Rows.Count == 5)
            {
                pagina++;
                RellenaDGV(false, pagina, rowsPaginas);
            }
        }

        /// <summary>
        /// Función que rellena la unidad seleccionada en el formulario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvUnidades_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            if (estado == "editando")
            {
                if (MessageBox.Show("Si selecciona otra unidad, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    // Si quiere perder información, que la pierda.
                    if (e.RowIndex >= 0)
                    {
                        // Obtenemos la información de la unidad.
                        string nombreUnidad = dgvUnidades.Rows[e.RowIndex].Cells[1].Value.ToString();
                        formularioUnidadEditar.Instancia.Un = CADUnidad.Instancia.getUnidad(nombreUnidad);

                        ENUnidad un = formularioUnidadEditar.Instancia.Un;

                        // Comprobamos si la unidad existe.
                        if (un != null)
                        {
                            // Pasamos al estado de edición.
                            estado = "editar";

                            // Cargamos el formulario de edición.
                            MuestraForm(formularioUnidadEditar.Instancia);

                            // Completamos la información del formulario.
                            formularioUnidadEditar.Instancia.cargarDatos(un.Nombre.ToString(), un.Defensa.ToString(), un.Ataque.ToString(), un.Velocidad.ToString(), un.Vida.ToString(), un.Tiempo.ToString(), un.Descripcion);
                        }
                        else
                        {
                            // Mostramos un error.

                        }
                    }
                }
                else
                {
                    dgvUnidades.ClearSelection();
                }
            }
            else
            {
                if (e.RowIndex >= 0)
                {
                    // Obtenemos la información de la unidad.
                    string nombreUnidad = dgvUnidades.Rows[e.RowIndex].Cells[1].Value.ToString();
                    formularioUnidadEditar.Instancia.Un = CADUnidad.Instancia.getUnidad(nombreUnidad);

                    ENUnidad un = formularioUnidadEditar.Instancia.Un;

                    // Comprobamos si la unidad existe.
                    if (un != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioUnidadEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioUnidadEditar.Instancia.cargarDatos(un.Nombre.ToString(), un.Defensa.ToString(), un.Ataque.ToString(), un.Velocidad.ToString(), un.Vida.ToString(), un.Tiempo.ToString(), un.Descripcion);
                    }
                    else
                    {
                        // Mostramos un error.

                    }
                }
            }


            
        }

        private void dgvUnidades_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }

        private void formularioUnidades_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }
    }
}
